#include <algorithm>
#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

int lengthOfLongestSubstring(string s) {
  int n = s.length();
  if (n < 2) {
    return n;
  }
  // 滑动窗口
  // 使用map记录子串中已存在的字符及其位置,
  // 如果遇到重复字符，记录当前窗口大小然后直接将窗口左侧移动至重复字符串之后的位置
  unordered_map<char, int> record;
  int max_length = 0;
  int i = 0;
  int j = i + 1;
  record[s[i]] = i;
  while (j < n) {
    auto iter = record.find(s[j]);
    if (iter == record.end() || iter->second < i) {
      record[s[j]] = j;
      j++;
    } else {
      // 此时存在重复的字符
      if (max_length < j - i) {
        max_length = (j - i);
      }
      // 计算需要移动的位置
      int pos = record.at(s[j]);
      i = pos + 1;
    }
  }
  if ((j - i) > max_length) {
    max_length = (j - i);
  }
  return max_length;
}

int main() {
  string s{"pwwkew"};
  int l = lengthOfLongestSubstring(s);
  cout << l << endl;
  return 0;
}